package cl.tinet.trainee.salas.ejb;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import cl.tinet.trainee.salas.dao.UsuarioDao;
import cl.tinet.trainee.salas.dao.UsuarioDaoInterfaz;
import cl.tinet.trainee.salas.model.ReservaSala;
import cl.tinet.trainee.salas.model.Usuario;
import cl.tinet.trainee.salas.model.excepciones.UsuarioContieneReservas;
import cl.tinet.trainee.salas.model.excepciones.UsuarioExisteException;
import cl.tinet.trainee.salas.model.excepciones.UsuarioInactivoException;
import cl.tinet.trainee.salas.model.excepciones.UsuarioNoExisteException;
import cl.tinet.trainee.salas.model.excepciones.UsuarioPasswordExcepction;

/**
 * 
 * Conexion que estipula el bean.
 *
 * @author Naht-Sams
 */
@Stateless(mappedName = "UsuarioBean", name = "UsuarioBean")
public class UsuarioBeanImpl implements UsuarioBeanInterfaz {
    /**
     * Lista de usuarios.
     */
    private List<Usuario> usuarios = new ArrayList<Usuario>();
    /**
     * Instancia de la clase UsuarioDao.
     */
    private UsuarioDaoInterfaz dao;
    /**
     * Contendra la clave del error capturado.
     */
    private String redireccion;
    /**
     * Nombre de la persistencia que esta haciendo la conexion a al BD.
     */
    @PersistenceContext(unitName = "MySqlDS")
    private EntityManager em;

    /**
     * 
     */
    @Resource
    SessionContext ctx;

    /**
     * 
     * Constructor del bean usuario.
     * 
     */
    @PostConstruct
    private void init() {
        if (dao == null) {
            dao = new UsuarioDao(em);
        }
    }

    /**
     * {@inheritDoc}
     * 
     * @throws UsuarioNoExisteException
     * @throws UsuarioInactivoException
     * @throws UsuarioPasswordExcepction
     */

    public Usuario buscarUsuarioBean(Usuario datosUsuario)
            throws UsuarioNoExisteException, UsuarioInactivoException,
            UsuarioPasswordExcepction {
        this.setRedireccion(null);
        Usuario usuario = null;
        usuario = dao.buscarUsuarioAntesDeCrear(datosUsuario);
        if (usuario == null) {
            throw new UsuarioNoExisteException(
                    UsuarioNoExisteException.NO_EXISTE);
        } else if (usuario != null) {
            if (usuario.isActivo()) {
                usuario = dao.verificarPasswordUsuario(datosUsuario);
                if (usuario != null) {
                    return usuario;
                } else {
                    throw new UsuarioPasswordExcepction(
                            UsuarioPasswordExcepction.USUARIO_PASSWORD_INCORRECTA);
                }

            } else if (!usuario.isActivo()) {
                throw new UsuarioInactivoException(
                        UsuarioInactivoException.INACTIVO);
            }
        }
        return usuario;
    }

    /**
     * {@inheritDoc}
     */
    public void modificarUsuarioBean(Usuario datoUsuario) {
        Usuario userDb = dao.buscarUsuario(datoUsuario);
        userDb.modificarDatosUsuario(datoUsuario);
    }

    /**
     * {@inheritDoc}
     * 
     * @throws UsuarioContieneReservas
     */
    public void eliminarUsuarioBean(Usuario datoUsuario)
            throws UsuarioContieneReservas {
        List<ReservaSala> listaUsuario;
        listaUsuario = dao.buscarReservasUsuario(datoUsuario);
        if (listaUsuario.isEmpty()) {
            Usuario user = dao.buscarUsuario(datoUsuario);
            // Si no lo encuentra no res
            dao.borrarUsuario(user);
        } else {
            throw new UsuarioContieneReservas(
                    UsuarioContieneReservas.USUARIO_CONTIENE_RESERVAS);
        }

    }

    /**
     * {@inheritDoc}
     * 
     * @throws UsuarioExisteException
     */
    public void buscarUsuarioAgregado(Usuario datosUsuario)
            throws UsuarioExisteException {
        Usuario usuario = null;
        usuario = dao.buscarUsuarioAntesDeCrear(datosUsuario);
        if (usuario != null) {
            throw new UsuarioExisteException(UsuarioExisteException.EXISTE);
        }
    }

    /**
     * {@inheritDoc}
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void agregarUsuarioBean(Usuario datosUsuario) {
        dao.agregarUsuario(datosUsuario);
    }

    /**
     * {@inheritDoc}
     */
    public List<Usuario> buscarUsuarios() {
        List<Usuario> listaUsuarios = dao.buscarListaUsuarios();
        return listaUsuarios;
    }

    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    /**
     * Allows to get the redireccion attribute value.
     * 
     * @return the redireccion value.
     */
    public final String getRedireccion() {
        return redireccion;
    }

    /**
     * Allows to set the redireccion attribute value.
     * 
     * @param redireccion
     *            new value for redireccion attribute.
     */
    public final void setRedireccion(String redireccion) {
        this.redireccion = redireccion;
    }

    /**
     * {@inheritDoc}
     */
    public List<Usuario> listar() {
        return usuarios;
    }
}
